home *** CD-ROM | disk | FTP | other *** search
/ Aminet 12 / Aminet 12 (1996)(GTI - Schatztruhe)[!][Jun 1996].iso / Aminet / dev / e / framework.lha / fw / lexStream.e < prev    next >
Encoding:
Text File  |  1996-01-28  |  2.1 KB  |  81 lines

  1.  
  2. -> lexStream is a lexical analyser for interpreters/compilers.
  3.  
  4. -> Copyright © Guichard Damien 01/04/1996
  5.  
  6. OPT MODULE
  7. OPT EXPORT
  8.  
  9. MODULE 'fw/any','fw/token'
  10.  
  11. -> lexical tokens and reserved words.
  12. DEF lexTokens:PTR TO token
  13.  
  14. OBJECT lexStream OF any
  15.   last:INT               -> last lexical token
  16.   value:LONG             -> numeral value
  17.   ident:PTR TO CHAR      -> current identifier
  18.   line:INT               -> current line
  19.   pos:PTR TO CHAR        -> current position in text
  20.   text:PTR TO CHAR       -> source text
  21.   storedLine:INT         -> stored line
  22.   storedPos:INT          -> stored position
  23.   storedLast:INT         -> stored lexical token
  24. ENDOBJECT
  25.  
  26. -> Spell all lexical tokens for the analyser.
  27. PROC spellTokenSet(tokenList:PTR TO LONG) OF lexStream
  28.   DEF tok:PTR TO token
  29.   DEF start
  30.   start:=tokenList[]++
  31.   lexTokens:=NEW tok.newToken(tokenList[]++,start++)
  32.   WHILE tokenList[]
  33.     lexTokens.add(NEW tok.newToken(tokenList[]++,start++))
  34.   ENDWHILE
  35. ENDPROC
  36.  
  37. -> Set source file to be scanned.
  38. -> Lexical tokens should not be longer than 40 characters.
  39. PROC attachStream(fileName:PTR TO CHAR) OF lexStream HANDLE
  40.   DEF handle=NIL,length
  41.   IF self.text THEN self.detachStream()
  42.   length:=FileLength(fileName)
  43.   IF (handle:=Open(fileName,OLDFILE))=NIL THEN Raise("OPEN")
  44.   self.text:=NewR(length+2)
  45.   IF Read(handle,self.text,length)<length THEN Raise("IN")
  46.   self.text[length]:="\0"
  47.   self.pos:=self.text
  48.   self.line:=1
  49.   self.ident:=String(40)
  50.   self.read()
  51. EXCEPT DO
  52.   IF handle THEN Close(handle)
  53.   ReThrow()
  54. ENDPROC
  55.  
  56. -> Detach source file scanned.
  57. -> MUST be preceded by an 'attachStream()' call.
  58. PROC detachStream() OF lexStream
  59.   Dispose(self.text)
  60.   self.text:=NIL
  61. ENDPROC
  62.  
  63. -> Read next lexical token from the text.
  64. -> Update line, pos, last, value, ident.
  65. PROC read() OF lexStream IS EMPTY
  66.  
  67. -> Store text position.
  68. PROC store() OF lexStream
  69.   self.storedLine:=self.line
  70.   self.storedPos:=self.pos-self.text
  71.   self.storedLast:=self.last
  72. ENDPROC
  73.  
  74. -> Restore text position.
  75. PROC restore() OF lexStream
  76.   self.line:=self.storedLine
  77.   self.pos :=self.text+self.storedPos
  78.   self.last:=self.storedLast
  79. ENDPROC
  80.  
  81.